iT邦幫忙

2021 iThome 鐵人賽

DAY 10
3

設定 alerting rules

昨天成功的讓 Prometheus 收集了一些指標,那麼今天就來設定警報吧。要做警報的話,在 Prometheus 裡面是透過 config 的 rules 欄位。目前有兩種 rule,一種是 recording rules,用來計算一些常用的指標並把它存下來,另一種是 alerting rules,顧名思義就是用來設定警報規則的。

那們首先第一個警報,我們就來做當服務掛掉的時候會發出通知吧,首先在 prometheus.yml 的隔壁創建一個 alert.yml,寫入以下內容(取自官方文件):

groups:
  - name: example
    rules:
      # Alert for any instance that is unreachable for >5 minutes.
      - alert: InstanceDown
        expr: up == 0
        for: 5m
        labels:
          severity: page
        annotations:
          summary: "Instance {{ $labels.instance }} down"
          description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

簡單介紹一下裡面的結構,它的根一定會是 groups,內容為 rule_group 組成的陣列,每個 rule_group 須帶有一個不重複的 name 作為識別,並且定義 rules 陣列,每個 rule 物件的 alert 欄位表示它的名字,expr 為檢查的表達式(使用 PromQL 語法),以上面的例子來說 up == 0 表示有任何一個 target 抓不到的情形。for 表示這個條件要持續多久,才會形成一個警報。labelsannotation 都是用來在警報上面加上額外資訊的,不過他們的用途稍有不同,在後面設定 Alertmanager 會詳細介紹。

訂好 alerting rules 之後,我們還需要讓 Prometheus 可以讀到它,所以在 prometheus.yml 裡面加上 rule_files

# 加上這個!
rule_files:
  - alert.yml

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: node
    static_configs:
      - targets: ["node-exporter:9100"]
  - job_name: caddy
    static_configs:
      - targets: ["caddy:3939"]

然後重開服務,打開 http://localhost:9090/rules,應該會看到以下畫面,那我們就成功載入 alerting rules 了。

設定 Alertmanager

雖然替 Prometheus 設定好 alerting rules 了,然而它本身其實並沒有處理發送警報給我們的部分,而是透過 Alertmanager 來達成,所以我們還需要在 docker compose 裡面,新增一個 Alertmanager 的服務,在 docker-compose.ymlservices 裡面新增 alertmanager 的定義:

alertmanager:
  image: prom/alertmanager:v0.23.0
  restart: unless-stopped
  volumes:
    - ./alertmanager:/etc/alertmanager
  command:
    - '--config.file=/etc/alertmanager/config.yml'
    - '--storage.path=/alertmanager'

然後我們還需要撰寫 Alertmanager 的設定檔,建立 alertmanager/config.yml,並且寫入下面內容:

route:
  receiver: "gmail-notifications"
receivers:
  - name: "gmail-notifications"
    email_configs:
      - to: <your-gmail>
        from: <your-gmail>
        smarthost: smtp.gmail.com:587
        auth_username: <your-gmail>
        auth_identity: <your-gmail>
        auth_password: <google app password>
        send_resolved: true

這邊需要申請一個 google 的應用程式密碼才能讓 Alertmanager 寄信到 gmail 信箱,設定的方式可以參考這邊。成功取得密碼之後把它填上去上面的 password 欄位,並且把其他 <your-gmail> 的部分換成自己的 gmail 帳號即可。

最後一步,你還需要告訴 Prometheus 要去哪邊找 Alertmanager,所以還要再修改一次 prometheus.yml,加入 alerting 這項設定:

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - "alertmanager:9093"

修改完成後,重開服務,順便把 NOJ 關掉,等個幾分鐘再打開信箱,就會看到 Alertmanager 送來的郵件了:

如果不確定警告是否有從 Prometheus 發出去的,也可以使用 ALERTS 這個表達式來查詢:

小結

今天成功的發出警告了,感覺又讓這個專案成長了一點,並且關於 Prometheus 的架設也算是到了尾聲,之後就是根據服務需求來設置各種警報的規則,關於這點我想官方文件的 best practice 應該值得參考,有興趣的讀者可以看看。


上一篇
Day 9:架設 Prometheus (1)
下一篇
Day 11:架設 Grafana (0)
系列文
這個 site 就是遜啦 - SRE 30 天登大人之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言